{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Copyright 2019 The Google Research Authors.\n",
    "\n",
    "Licensed under the Apache License, Version 2.0 (the \"License\");\n",
    "you may not use this file except in compliance with the License.\n",
    "You may obtain a copy of the License at\n",
    "\n",
    "     http://www.apache.org/licenses/LICENSE-2.0\n",
    "\n",
    "Unless required by applicable law or agreed to in writing, software\n",
    "distributed under the License is distributed on an \"AS IS\" BASIS,\n",
    "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
    "See the License for the specific language governing permissions and\n",
    "limitations under the License."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Recovering Local Dynamics using RL-LIM with Synthetic Datasets\n",
    "\n",
    " * Jinsung Yoon, Sercan O Arik, Tomas Pfister, \"RL-LIM: Reinforcement Learning-based Locally Interpretable Modeling\", arXiv preprint arXiv:1909.12367 (2019) - https://arxiv.org/abs/1909.12367.\n",
    " \n",
    "This notebook describes the user-guide of recovering local dynamics with synthetic datasets using \"Reinforcement Learning based Locally Interpretable Modeling (RL-LIM)\".\n",
    "\n",
    "RL-LIM efficiently utilizes the small representational capacity of locally interpretable models by training with a small number of training samples that are determined to have the highest value contribution to the fitting of a locally interpretable model. In order to select these highest-value instances, we train instance-wise weight estimators (modeled with deep neural networks) using a reinforcement signal that quantifies the fidelity metric (i.e. how well does the model approximate the black-box model predictions). RL-LIM constructs locally interpretable models with the selected highest-value instances and outputs instance-wise explanations and interpretable predictions.\n",
    "\n",
    "On real-world datasets it is challenging to directly evaluate the explanation quality of the locally interpretable models due to the absence of ground-truth explanations. Thus we initially focus on synthetic datasets (with known ground-truth explanations (local dynamics)) to directly evaluate how well the locally interpretable models can recover the underlying local dynamics."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  Prerequisite\n",
    "\n",
    " * Clone https://github.com/google-research/google-research.git to the current directory."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "from git import Repo\n",
    "\n",
    "# Current working directory\n",
    "repo_dir = os.getcwd() + '/repo'\n",
    "\n",
    "if not os.path.exists(repo_dir):\n",
    "    os.makedirs(repo_dir)\n",
    "\n",
    "# Clones github repository\n",
    "if not os.listdir(repo_dir):\n",
    "    git_url = \"https://github.com/google-research/google-research.git\"\n",
    "    Repo.clone_from(git_url, repo_dir)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Necessary packages and function calls\n",
    "\n",
    " * ridge: Ridge regression model used as an interpretable model.\n",
    " * load_synthetic_data: Data loader for synthetic datasets (Syn1, Syn2, Syn3).\n",
    " * rllim: RL-LIM class for training instance-wise weight estimator.\n",
    " * rllim_metrics: Evaluation metrics for the locally interpretable models in various metrics (fidelity and absolute weight difference (AWD))."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.linear_model import Ridge\n",
    "\n",
    "# Sets current directory\n",
    "os.chdir(repo_dir)\n",
    "\n",
    "from rllim.data_loading import load_synthetic_data\n",
    "from rllim import rllim\n",
    "from rllim.rllim_metrics import awd_metric, fidelity_metrics, plot_result"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data loading\n",
    "\n",
    " * Load training, probe and testing datasets and ground-truth explanations (local dynamics).\n",
    " * In this notebook, we generate synthetic training, probe, and testing datasets.\n",
    " \n",
    "**outputs:**\n",
    " * x_train, y_train: Training features and labels.\n",
    " * x_probe, y_probe: Probe features and labels.\n",
    " * x_test, y_test: Testing features and labels.\n",
    " * c_test: Ground truth local dynamics of testing samples."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Finished data loading.\n"
     ]
    }
   ],
   "source": [
    "# Data name: 'Syn1' or 'Syn2' or 'Syn3' in this notebook\n",
    "\n",
    "# X ~ N(0, I)\n",
    "# Syn1: Y = X_0 + 2 X_1 if X_10 < 0             &  Y = X_2 + 2 X_3 if X_10 >= 0\n",
    "# Syn2: Y = X_0 + 2 X_1 if X_10 + e^{X_11} < 1  &  Y = X_2 + 2 X_3 if X_10 + e^{X_11} >= 1\n",
    "# Syn3: Y = X_0 + 2 X_1 if X_10 + (X_11)^3 < 0  &  Y = X_2 + 2 X_3 if X_10 + (X_11)^3 >= 0 \n",
    "\n",
    "data_name = 'Syn1'\n",
    "\n",
    "# The number of training, probe and testing samples\n",
    "dict_no = dict()\n",
    "dict_no['train'] = 1000\n",
    "dict_no['probe'] = 100\n",
    "dict_no['test'] = 1000\n",
    "\n",
    "# The number of dimensions\n",
    "dict_no['dim'] = 11\n",
    "\n",
    "# Random seed\n",
    "seed = 0\n",
    "\n",
    "# Loads data\n",
    "x_train, y_train, x_probe, y_probe, x_test, y_test, c_test = load_synthetic_data(data_name, dict_no, seed)\n",
    "\n",
    "print('Finished data loading.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 0 & Step 1:\n",
    "\n",
    "In this notebook, we skip Step 0 and Step 1 (of RL-LIM) because we treat y_train, y_probe, and y_test as the predictions of the pre-trained black-box model. We directly use the ground truth function as the black-box model and focus on how well locally interpretable modeling can capture the local dynamics.\n",
    "\n",
    " * Step 0: Black-box model training.\n",
    " * Step 1: Auxiliary dataset construction."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 2: Interpretable baseline training\n",
    "\n",
    "To improve the stability of the instance-wise weight estimator training, an interpretable baseline model is observed to be beneficial. We use a globally interpretable model (in this notebook, we use Ridge regression) optimized to replicate the predictions of the black-box model.\n",
    "\n",
    "1. **Input**: \n",
    " * locally interpretable model: Ridge regression (we can switch this to linear regression). The model must have fit, predict (for regression) or predict_proba (for classification), intercept_ and coef_  as the methods.\n",
    " \n",
    " \n",
    "2. **Output**:\n",
    " * Trained interpretable baseline model: Function that tries to replicate the predictions of the black-box model using globally interpretable model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Finished interpretable baseline training.\n"
     ]
    }
   ],
   "source": [
    "# Defines baseline\n",
    "baseline = Ridge(alpha=1)\n",
    "\n",
    "# Trains interpretable baseline model\n",
    "baseline.fit(x_train, y_train)\n",
    "\n",
    "print('Finished interpretable baseline training.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 3: Trains instance-wise weight estimator\n",
    "\n",
    "We train an instance-wise weight estimator using training dataset (x_train, y_train) and probe dataset (x_probe, y_probe) using reinforcement learning.\n",
    "\n",
    "1. **Input**: \n",
    " * Network parameters: Set network parameters of instance-wise weight estimator.\n",
    " * Locally interpretable model: Ridge regression (we can switch this to linear regression). The model must have fit, predict (for regression) or predict_proba (for classification), intercept_ and coef_ as the methods.\n",
    " \n",
    " \n",
    "2. **Output**:\n",
    " * Instancewise weight estimator: Function that uses training set and a testing sample as inputs to estimate weights for each training sample to construct locally interpretable model for the testing sample."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "WARNING: The TensorFlow contrib module will not be included in TensorFlow 2.0.\n",
      "For more information, please see:\n",
      "  * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\n",
      "  * https://github.com/tensorflow/addons\n",
      "If you depend on functionality not listed there, please file an issue.\n",
      "\n",
      "WARNING:tensorflow:From /usr/local/google/home/jinsungyoon/anaconda3/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 2000/2000 [04:09<00:00,  8.64it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Finished instance-wise weight estimator training.\n",
      "WARNING:tensorflow:From /usr/local/google/home/jinsungyoon/anaconda3/lib/python3.7/site-packages/tensorflow/python/training/saver.py:1266: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use standard file APIs to check for files with this prefix.\n",
      "INFO:tensorflow:Restoring parameters from ./tmp/model.ckpt\n",
      "INFO:tensorflow:Restoring parameters from ./tmp/model.ckpt\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 1/1 [00:00<00:00,  7.96it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Finished instance-wise weight estimations, interpretable predictions, and local explanations.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "# Instance-wise weight estimator network parameters\n",
    "parameters = dict()\n",
    "parameters['hidden_dim'] = 100\n",
    "parameters['iterations'] = 2000\n",
    "parameters['num_layers'] = 5\n",
    "parameters['batch_size'] = 900\n",
    "parameters['batch_size_inner'] = 10\n",
    "parameters['lambda'] = 1.0\n",
    "\n",
    "# Checkpoint file name\n",
    "checkpoint_file_name = './tmp/model.ckpt'\n",
    "\n",
    "# Defines locally interpretable model\n",
    "interp_model = Ridge(alpha=1)\n",
    "\n",
    "# Initializes RL-LIM\n",
    "rllim_class = rllim.Rllim(x_train, y_train, x_probe, y_probe, parameters, interp_model, baseline, checkpoint_file_name)\n",
    "\n",
    "# Trains RL-LIM\n",
    "rllim_class.rllim_train()\n",
    "\n",
    "print('Finished instance-wise weight estimator training.')\n",
    "\n",
    "## Output functions\n",
    "# Instance-wise weight estimator for x_test[0, :]\n",
    "dve_out = rllim_class.instancewise_weight_estimator(x_train, y_train, x_test[0, :])\n",
    "\n",
    "# Interpretable predictions (test_y_fit) and instance-wise explanations (test_coef) for x_test[0, :]\n",
    "test_y_fit, test_coef = rllim_class.rllim_interpreter(x_train, y_train, x_test[0, :], interp_model)\n",
    "\n",
    "print('Finished instance-wise weight estimations, interpretable predictions, and local explanations.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step 4: Interpretable inference\n",
    "\n",
    "Unlike Step 3 (training instance-wise weight estimator), we use a fixed instance-wise weight estimator (without the sampler and interpretable baseline) and merely fit the locally interpretable model at inference. Given the test instance, we obtain the selection probabilities from the instance-wise weight estimator, and using these as the weights, we fit the locally interpretable model via weighted optimization. \n",
    "\n",
    "1. **Input**: \n",
    " * Locally interpretable model: Ridge regression (we can switch this to linear regression). The model must have fit, predict (for regression) or predict_proba (for classification), intercept_ and coef_ as the methods.\n",
    " \n",
    " \n",
    "2. **Output**:\n",
    " * Instance-wise explanations (test_coef): Estimated local dynamics for testing samples using trained locally interpretable model.\n",
    " * Interpretable predictions (test_y_fit): Local predictions for testing samples using trained locally interpretable model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./tmp/model.ckpt\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 1000/1000 [00:04<00:00, 225.73it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Finished interpretable predictions and local explanations.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "# Trains locally interpretable models and output instance-wise explanations (test_coef) and\n",
    "# interpretable predictions (test_y_fit) \n",
    "test_y_fit, test_coef = rllim_class.rllim_interpreter(x_train, y_train, x_test, interp_model)\n",
    "\n",
    "print('Finished interpretable predictions and local explanations.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Evaluation\n",
    "\n",
    "We use two metrics (fidelity and average weight difference (AWD)) to evaluate the locally interpretable models.\n",
    "\n",
    " * Fidelity: Difference between black-box model predictions (y_test_hat) and interpretable predictions (test_y_fit). In this notebook, we use Mean Absolute Error (MAE) as the metric.\n",
    " * Average Weight Difference (AWD): Mean absolute difference between ground truth local dynamics (test_c) and instance-wise explanations (test_coef)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "fidelity of RL-LIM in terms of MAE: 0.5137\n",
      "AWD of RL-LIM: 0.183\n"
     ]
    }
   ],
   "source": [
    "# Fidelity\n",
    "mae = fidelity_metrics (y_test, test_y_fit, metric='mae')\n",
    "print('fidelity of RL-LIM in terms of MAE: ' + str(np.round(mae, 4)))\n",
    "\n",
    "# AWD\n",
    "awd = awd_metric (c_test, test_coef)\n",
    "print('AWD of RL-LIM: ' + str(np.round(awd, 4)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Fidelity plot\n",
    "\n",
    "We visualize the fidelity (in terms of MAE) of the testing samples based on the distance from the boundary where the local dynamics change (in percentile).\n",
    "\n",
    " * x-axis: Distance from the boundary where the local dynamics change (in percentile).\n",
    " * y-axis: Fidelity (in terms of MAE)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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nVxJXcVesWJF+vfvz6xZs0hISOCrr75i4cKFRX59dnY2xpz78RYcHFzoxWVjxoyhb9++Z5+fOHEi3/eTlZXF+vXrefzxx3Mtt0uXLnl6ey1evJjOnTtTt27dXImnV69ezJgxg23bttG8efMivzdXGjduTM+ePZk6dSo33WSd5p06dSoxMTG53lNp0iOKAgxsX5uujarz3KKtJB896e1wlA9zNSxMRGgwo3rFeTyWefPmsXbtWhYtWkTPnj154403+OCDD9xaxvLly3P9Ag8NDS3RGG+77Ta++uorXnrpJaKjo93qctqwYcNccb377ruFvqZu3brEx8effbRt2zbfsgcOHCA7O5uYmJg885ynHThwgGXLluWpq5wd+uHD+V4K5pa77rqL5cuX89tvv3H8+HE++OAD7rzzzhL/XPKjRxQFEBGeva4lvV7+jtFzNzHzjg465INyKad3ky/0emrRosXZXk89evSgVatWjB07lkGDBhW5+2m7du1Yu3ZtqcXYs2dPoqOjeeGFF3jooYfcahZbsGABp06dG26nfv36JRpbdHQ0wcHBeZqZAPbv309UVNTZ59WqVaN27dpMnDjR5bJyuuCer2uuuYbatWszdepU4uLiOHnyJEOHDi2RZReFJopC1K5antFXNmXsZ7/y0do9DOxQx9shKR/Vr02sz93PJCwsjAkTJtC3b1/eeOMNl71nXImMjCQ+vvQuYQoKCmLs2LEsXryYO+64w63XtmzZspSisoSGhtKuXTvmzJnD2LFjz/44/P7770lOTs618+/duzdTp06lXr16VK9e/bzWm3OiOj09nYiI3CNZBwcHM2zYMCZOnEhsbCy9evWiXr1657U+d2iiKIJbLqnLwk37eHrhVi6Nq8GFlXU4cuU/rr32Wtq2bcsLL7zAPffck2sntGLFClJTU3OVDwkJoV+/fgUuMz09nTlz5uSZ3qhRI1q3bl2kuEaMGOGxk7HuevLJJ7nyyivp378/w4YNY//+/TzxxBN5mp7+/e9/88knn9CtWzcefPBBmjRpwvHjx/ntt99YtWoV8+bNK/I6c85lvPDCC1xxxRWEhITQrl27s/OHDh3K+PHj2bx589mutJ6iiaIIgoKE/7u+Fb1fXsHouZt4Z3B7bYJSfmXs2LH079+fKVOm8OCDD56dPn78+DxlK1SoQFpaWoHLO3LkCDfccEOe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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Reports fidelity plot\n",
    "plot_result(x_test, data_name, y_test, test_y_fit, c_test, test_coef, metric='mae', criteria='Fidelity')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. AWD plot\n",
    "\n",
    "We visualize the AWD of the testing samples based on the distance from the boundary where the local dynamics change (in percentile).\n",
    "\n",
    " * x-axis: Distance from the boundary where the local dynamics change (in percentile).\n",
    " * y-axis: AWD."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Reports AWD plot\n",
    "plot_result(x_test, data_name, y_test, test_y_fit, c_test, test_coef, metric='mae', criteria='AWD')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
